import numpy as np
import timeit

print("****"*100)
score = np.array([[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69]])

print(score)

list1 = [[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69]]
print(list1)

print("****"*100)

a = []
for i in range(900000):
    a.append(i)

start = timeit.default_timer()
s1 = sum(a)
end = timeit.default_timer()
print(f"python处理时间:{end - start}")

b = np.array(a)
start = timeit.default_timer()
s2 = np.sum(b)
end = timeit.default_timer()
print(f"python处理时间:{end - start}")

print("****"*100)

# 定义整型数组
a = np.array([2,3,4])

# 定义字符串数组
b = np.array(['a','b','c'])

# 定义整型二维数组
c = np.array([[2,3,4],[5,6,7]])

# 定义整型三维数组
d = np.array([[[2,3,4],[5,6,7]],[[8,9,10],[11,12,13]]])

print(a)
print(b)
print(c)
print(d)

print("****"*100)

# 使用 numpy.asarray
arr3 = np.asarray([1, 2, 3])    # arr4 是 arr3 的视图
arr4 = np.asarray(arr3)

arr3[0] = 20
print(arr3)
print(arr4)

print("****"*100)

# 定义字符串数组
a = np.array(['张胜男','王大锤','赵小虎'],dtype=np.str_)
# 输出数据类型
print(a.dtype)

# 定义unicode类型数组
b = np.array(['abc','def','ghi'],dtype='U3')
print(b.dtype)

# 定义int32类型数组
c = np.array([[1, 2, 3, 4],[5, 6, 7, 8]],dtype='i4')
print(c.dtype)

# 定义float32类型数组
d = np.array([1.2,2.4,3.5],dtype='f4')
print(d.dtype)

# 定义datetime64类型数组
e = np.array(['2024-01-01','2024-02-01','2024-03-01'],dtype='datetime64')
print(e.dtype)

print("****"*100)

# 定义ndarray数组
a = np.array(['张胜男','王大锤','赵小虎'])
b = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])

# 输出数组属性
# (行,列) 列如果空着->表示一列
print(f"shape:{a.shape}")     #(3,)
print(f"shape:{b.shape}")     #(2,4)

# 表示维度
print(f"ndim:{a.ndim}")     # 1
print(f"ndim:{b.ndim}")     # 2

# 元素的总合
print(f"size:{a.size}")     # 3
print(f"size:{b.size}")     # 8

# 返回元素类型
print(f"dtype:{a.dtype}")       # 字符串
print(f"dtype:{b.dtype}")       # 整型

# 结果取决于列表中值的类型
print(f"itemsize:{a.itemsize}")       # 12
print(f"itemsize:{b.itemsize}")       # 8

print("****"*100)

# 创建一个全零数组，三行四列
zeros = np.zeros([3,4])     # 参数是一个表示形状的元组
print(f"zeros:{zeros}")

# 创建一个全一数组，2行3列
ones = np.ones((2, 3))
print(f"ones:{ones}")

# 创建一个空数组，其实是未初始化的数组，里面的值是随机的
empty = np.empty((2, 2))
print(f"empty:{empty}")

# 创建一个具有指定范围内的数组,参数：high，或者low和high
range_array = np.arange(10) #linspace ，logspace效果类似
print(f"range_array:{range_array}")

# 创建一个填充随机数的数组，参数：low, high, size(二维写法：(2,3)）
random_integers = np.random.randint(1, 10, 5 )
print(f"random_integers:{random_integers}")

print("****"*100)

# 返回改变形状后的数组。
arr = np.array([[1, 2, 3],
                [4, 5, 6]])
print(f"返回多维数组的一维结果: {arr.ravel()}")

print(f"转置，行列互换: {arr.T}")

print(f"指定转换的行和列，参数2输入-1系统将自动计算大小: {arr.reshape(3, 2)}")    #这里是使用的原始值，且顺时针排列的，3行2列
# 直接改变数组本身的形状。
arr.resize(2,2)     #这里原始数据多余的值，会被抛弃
print(arr)

arr = np.array([1,2,3,3,3])
print(f"列表数据去重，多维数组还可以指定轴: {np.unique(arr)}")

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
concatenated = np.hstack((arr1, arr2))
print(f"水平拼接数组，类似join: {concatenated}")

concatenated = np.vstack((arr1, arr2))
print(f"垂直拼接数组，类似union: {concatenated}")

print("****"*100)

# 一维数组的运算
a = np.array( [10,20,30] )
b = np.arange( 1,4 )    #[1,2,3]
c = a + b       #[11,22,33]
print(f"一维数组相加： {c}")
# 二维数组的运算
a = np.array( [[10,20,30],[40,50,60]] )
b = np.arange( 1,7 ).reshape(2,3)       #[1,2,3,4,5,6]=>[[1,2,3],[4,5,6]]
c = a + b
print(f"二维数组的运算: {c}")        #[[11,22,33],[44,55,66]]

print("****"*100)

# numpy函数默认对整个数据进行处理，可以用第二个参数axis控制在哪个轴进行计算
arr = np.array([11,22,33,44,55,66,77,88,99])
print(np.max(arr))# 求最大值，如果用np.max(a,axis=1)) 则在行上进行计算，0则为列
print(np.min(arr))# 最小值
print(np.sum(arr))# 求和
print(np.mean(arr))# 平均值
print(np.median(arr))# 中位数

print("****"*100)

# 一维数组切片
arr = np.array([11,22,33,44,55,66,77,88,99])
print(arr[1:4])

# 二维数组切片      0 1 2
arr2 = np.array([[1,2,3],
                 [4,5,6],
                 [7,8,9]])
# 先截取行，再截取列，以下代码输出5，6
print(arr2[1:2,1:3])    #[[5,6]]
# 列切片，输出第1，2列
print(arr2[:,1:3])      #[[2,3],[5,6],[8,9]]

print("****"*100)

# 一维数组和数字的广播
a = np.array([1, 2, 3])
b = 1
print(f"一维数组和数字的广播: {a + b}")   #[2,3,4]

#二维数组和一维数组的广播
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([1, 2, 3])     #列必须相同
print(f"二维数组和一维数组的广播: {a + b}")     #[[2,4,6],[5,7,9]]

print("****"*100)

































